package com.wty.mianshi.recursion;


import com.wty.mianshi.common.Node;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

/**
 * 递归实现链表的生成
 * 例如给你一个【1，2，3，4，5】的数组，生成一个链表
 */
public class LinkedListCreator {

    /**
     * 递归生成链表
     * 1.递归首先要明确好函数的职责 包括参数的
     * 2.每次调用需要缩小问题规模，并且规模缩小程度必须为1
     * 3.先考虑一般的情况，然后再考虑特殊的情况
     * 4.多用假设，假设createNode返回的是一个节点
     * @param dataList 要生成链表的数据集合
     * @return
     */
    public <T> Node<T> createNode(List<T> dataList){

        /**
         * 特殊情况，如果集合为空，返回一个null
         */
        if(dataList.isEmpty()){
            return null;
        }


        //创建第一个节点
        Node firstNode=new Node(dataList.get(0));
        firstNode.setNext(createNode(dataList.subList(1,dataList.size())));
        return firstNode;
    }

    /**
     * 从链表的某一个节点开始打印链表各个节点存储的数据
     * @param node
     */
    public void printLinkedList(Node node){
        while (node!=null){
            System.out.print(node.getData());
            System.out.print(" ");
            node=node.getNext();
        }
        System.out.println();
    }






    public static void main(String args[]){
        LinkedListCreator linkedListCreator=new LinkedListCreator();
        Node node1=linkedListCreator.createNode(new ArrayList<Integer>());
        linkedListCreator.printLinkedList(node1);

        Node node2=linkedListCreator.createNode(Arrays.asList(1));
        linkedListCreator.printLinkedList(node2);

        Node node3=linkedListCreator.createNode(Arrays.asList(1,2,3,4,5));
        linkedListCreator.printLinkedList(node3);




    }

}
